package com.STS.ELearning.Classes
{
	import com.STS.ELearning.Events.Mesaj;
	
	import flash.events.Event;
	import flash.events.HTTPStatusEvent;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.events.SecurityErrorEvent;
	import flash.filesystem.*;
	import flash.net.FileReference;
	import flash.net.URLRequest;
	import flash.net.URLRequestHeader;
	import flash.net.URLStream;
	import flash.net.URLVariables;
	import flash.system.LoaderContext;
	import flash.text.engine.BreakOpportunity;
	import flash.utils.ByteArray;
	import flash.utils.Endian;
	import flash.xml.*;
	
	import mx.controls.Alert;
	import mx.controls.SWFLoader;
	import mx.events.CloseEvent;
	import mx.messaging.events.MessageEvent;
	import mx.rpc.soap.WebService;
	import mx.rpc.soap.mxml.WebService;
	import mx.utils.StringUtil;
	import mx.utils.URLUtil;
	
	
	[Event(name="DosyaIndirildi",type="mx.messaging.events.MessageEvent")]
	[Event(name="DosyaIndirmeIlerleme",type="mx.messaging.events.MessageEvent")]
	[Event(name="DosyaIndirilemedi",type="mx.messaging.events.MessageEvent")]
	public class IndirmeIslemleri extends Base
	{
		import com.STS.ELearning.DAO.WebGecmisi;
		import com.STS.ELearning.VO.WebGecmisiVO;
		
		private var FIRSTLOADFLAG:Boolean=true;
		private var wg:WebGecmisi=WebGecmisi.getInstance();
		
		public function IndirmeIslemleri()
		{
			super();
		}
		
		public function get gecmis():Array
		{
			
			var arWG:Array=new Array();
			var arr:Array=wg.getTableContent("sonTarih");
			for each(var it:Object in arr)
			{
				arWG.push(new WebGecmisiVO(it));
			}
			return arWG;
		}
		
		
		private var fs:FileStream;
		private var urlStream:URLStream;
		
		public static const DOWNLOAD_PATH:String="downloads";
		public static const EDosyaIndirildi:String="DosyaIndirildi";
		public static const EDosyaIndirilemedi:String="DosyaIndirilemedi";
		public static const EDosyaIndirmeIlerleme:String="DosyaIndirmeIlerleme";
		
		public  function getUrlFileName(url:String):String
		{
			
			var arr:Array=url.split('/');
			
			if(arr!=null && arr.length>0)
			{
				url=arr[arr.length-1];
			}
			arr=url.split('?');
			if(arr!=null && arr.length>0)
			{
				url=arr[arr.length-1];
			}
			return url;
		}
		
		private function streamIsle(f:File):void
		{
			if(urlStream==null || !urlStream.connected)
				return;
			var length:uint=urlStream.bytesAvailable;
			if(length>0)
			{
				var bytes:ByteArray=new ByteArray();
				bytes.endian=Endian.LITTLE_ENDIAN;
				urlStream.readBytes(bytes,0,length);
					if(FIRSTLOADFLAG)
					{
						if(bytes.readUnsignedInt()!=0x04034b50)//Geçerli bir zip dosyası değil.
						{
							dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("İndirmeye Çalıştığınız Dosya Geçerli Bir Ders İçeriği Dosyası Değil.","")));
							IPTALFLAG=true;
							urlStream.close();
							return;
						}else
							bytes.position=0;
						
					}
				
				if(fs==null)
					fs=new FileStream();
				fs.open(f,FileMode.APPEND);
				fs.writeBytes(bytes,0,length);
				fs.close();
			}
			
		}
		
		
		
		private function crtEDosyaIndirmeIlerlemeEvent(oran:int,url:String):MessageEvent
		{
			//cancalable true
			return new MessageEvent(EDosyaIndirmeIlerleme,false,true,(new Mesaj(oran.toFixed(),url)));
		}
		private function kapat(f:File):void
		{
			
			streamIsle(f);
			urlStream.close();
			if(fs!=null)
				fs.close();
		}
		
		private var IPTALFLAG:Boolean=false;
		public function downloadFile(f:File,r:URLRequest):void
		{
			FIRSTLOADFLAG=true;
			
			var wo:WebGecmisiVO;
			var ar:Array=wg.getTableContent(null," (url=@url) ",[{name:"url",value:r.url}]);
			var oDate:Date=new Date();
			if(ar!=null && ar.length>0)
			{	wo=ar[0] as WebGecmisiVO; }
			else 
			{
				wo=new WebGecmisiVO();
				wo.idKullanici=IcerikYoneticisi.getInstance().Kullanici.id;
				wo.ilkTarih=oDate;
				wo.url=r.url;
				wo.toplamBoyut=0;
				wo.indirilenBoyut=0;
			}
			wo.sonTarih=oDate;
			if((wo.ilkTarih as Date)==oDate)
			{
				wg.insertRow(wo);
			}else
			{
				wg.updateRow(wo);
			}
			
			if(f==null)
			{	
				f=File.applicationStorageDirectory.resolvePath(DOWNLOAD_PATH);
				if(!f.exists)f.createDirectory();
			}
			
			if(f.isDirectory)
			{
				f=f.resolvePath(wo.id.toString()+".tgb");
			}
			if(f.exists && f.size==wo.toplamBoyut)
			{
				
				Alert.show(
					"Bu dosya zaten indirilmiş.\nDosyayı yeniden indirmek ister misiniz?"
					,"UYARI"
					,Alert.NO|Alert.YES
					,null
					,function(evt:CloseEvent):void{
						if(evt.detail==Alert.YES)
						{
							f.deleteFile(); //Ders içeriğini yenile
							FIRSTLOADFLAG=true;
							dFile(wo,f,r);
							
						}else
						{
							//Tum islemi iptal et
							dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("Dosya Mevcut olduğundan indirilmeden açılacak.",[r.url,f.nativePath])));
						}
					}
					,null
					,Alert.YES
				);
			}else
			{
				dFile(wo,f,r);
			}
		}
		private function dFile(wo:WebGecmisiVO,f:File,r:URLRequest):void
		{
			if(f.exists && f.size==wo.toplamBoyut) 
			{
				
				//iptal
				dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("Dosya zaten indirilmiş.",[f.nativePath,r.url])));
				return ;
			
			}
			
			if(f.exists && f.size<wo.toplamBoyut)
			{
				r.requestHeaders.push(new URLRequestHeader("Range", "bytes=" + f.size + "-" +wo.toplamBoyut));
				FIRSTLOADFLAG=false;
			}
			if(!f.exists)
			{
				fs=new FileStream();
				fs.open(f,FileMode.WRITE);
				fs.close();
			}
			urlStream=new URLStream();
			urlStream.endian=Endian.LITTLE_ENDIAN;
			urlStream.addEventListener(
				Event.OPEN,
				function(evt:Event):void{
					var evx:MessageEvent=crtEDosyaIndirmeIlerlemeEvent(2,r.url);
					dispatchEvent(evx);
					if(evx.isDefaultPrevented())
					{
						IPTALFLAG=true;
						
					}
				}
			);
			
			urlStream.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS,function(evt:HTTPStatusEvent):void{
				
				if(!FIRSTLOADFLAG) return;
				var resH:Array=evt.responseHeaders;
				for(var ixy:int=0;ixy<resH.length;ixy++)
				{
					var it:Object =resH[ixy];
					if(it.name=="Content-Length" && (wo.toplamBoyut==0 || FIRSTLOADFLAG==true))
					{
						wo.toplamBoyut=uint(it.value)
						wg.updateRow(wo);	
						if(IPTALFLAG==true)
						{
							//iptal
							dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("Dosya indirme işlemi iptal edildi.",[f.nativePath,r.url])));
						}
						break;
					}
				}
			});
			urlStream.addEventListener(
				ProgressEvent.PROGRESS,
				function(evt:ProgressEvent):void{
					
					if(urlStream.bytesAvailable<(1024*500) && evt.bytesLoaded<evt.bytesTotal)
						return;
					streamIsle(f);
					
					var oran:int=int(2+(evt.bytesLoaded/evt.bytesTotal)*98);
					var evtMes:MessageEvent=crtEDosyaIndirmeIlerlemeEvent(oran,r.url);
					dispatchEvent(evtMes);
					if(evtMes.isDefaultPrevented() || IPTALFLAG==true)
					{
						kapat(f);
						dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("Dosya indirme işlemi iptal edildi.",[f.nativePath,r.url])));						
					}
				}
			);
			urlStream.addEventListener(Event.COMPLETE,function(evt:Event):void{
				kapat(f);
				dispatchEvent(new MessageEvent(EDosyaIndirmeIlerleme,false,false,(new Mesaj("100",[f.nativePath,r.url]))));
				dispatchEvent(new MessageEvent(EDosyaIndirildi,false,false,new Mesaj("Dosya başarıyla indrildi.",[f.nativePath,r.url])));
			});
			urlStream.addEventListener(IOErrorEvent.IO_ERROR,function(evt:IOErrorEvent):void{
				kapat(f);
				dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("Network bağlantınızda problem var,yada dosya adresi yanlış belirtildi.",[f.nativePath,r.url])));
			});
			urlStream.addEventListener(SecurityErrorEvent.SECURITY_ERROR,function(evt:SecurityErrorEvent):void{
				kapat(f);
				dispatchEvent(new MessageEvent(EDosyaIndirilemedi,false,false,new Mesaj("Bağlantıyla ilgili bir güvenlik problemi oluştu.",[f.nativePath,r.url])));
			});
			urlStream.load(r);
		}
	}
}